// 滚动条滚动距离
function getScrollOffset() {
    if (window.pageXOffset) {
        return {
            left: window.pageXOffset,
            top: window.pageYOffset
        }
    } else {
        return {
            left: document.body.scrollLeft + document.documentElement.scrollLeft,
            top: document.body.scrollTop + document.documentElement.scrollTop
        }
    }
}

// html文档的宽高
function getScrollSize() {
    if (document.body.scrollWidth) {
        return {
            width: document.body.scrollWidth,
            height: document.body.scrollHeight
        }
    } else {
        return {
            width: document.documentElement.scrollWidth,
            height: document.documentElement.scrollHeight
        }
    }
}

// 获取可视窗口的宽高
function getViewportSize() {
    if (window.innerHeight) {
        return {
            width: window.innerWidth,
            height: window.innerHeight
        }
    } else {
        if (document.compatMode === 'BackCompat') {
            return {
                width: document.body.clientWidth,
                height: document.body.clientHeight
            }
        } else {
            return {
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            }
        }
    }
}

// 绑定事件处理函数
function addEvents(elem, type, fn) {
    if (elem.addEventListener) {
        elem.addEventListener(type, fn, false);  // 要返回吗，这个不用  
    } else if (elem.attachEvent) {
        elem.attachEvent('on' + type, function () {
            fn.call(elem);
        });
    } else {
        elem['on' + type] = fn;
    }
}



/**
 * @elemChildren 寻找子元素程序
 * @param node：父节点元素
 */
function elemChildren(node) {
    // 声明一个类数组用作缓冲池来保存 子元素
    var temp = {
        'length': 0,
        'push': Array.prototype.push,
        'splice': Array.prototype.splice
    }

    var children = node.childNodes, // 保存所有的子节点元素
        len = children.length,
        item; // 临时变量保存单个子元素

    for (var i = 0; i < len; i++) {
        item = children[i];

        // 子节点元素的类型为元素节点
        if (item.nodeType === 1) {
            temp.push(item);
        }
    }

    return temp;
}

/**
 * @elemParent 寻找父级元素
 * @param node: 目标元素
 * @param n：寻找第n层父级元素
 */
function elemParent(node, n) {
    var type = typeof (n);

    if (type === 'undefined') {
        return node.parentNode;
    } else if (n <= 0 || type !== 'number') {
        return undefined;
    }

    while (n) {
        node = node.parentNode;
        n--;
    }

    return node;
}
